package pe.com.bn.sach.service.impl;

import java.util.ArrayList;
import java.util.List;
import java.util.Hashtable;
import java.util.ResourceBundle;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.log4j.Logger;
	 
import pe.bn.WSServiceHost.serHost.model.BodyConsultaIngreso;
import pe.bn.WSServiceHost.serHost.model.HeadRequest;
import pe.bn.WSServiceHost.serHost.model.HeadRespose;
import pe.bn.WSServiceHost.serHost.model.WSConsultaIngreso;
import pe.com.bn.sach.calculoCuota.Util;
import pe.com.bn.sach.expediente.controller.ExpedienteController;
import pe.com.bn.sach.expediente.form.AbonoForm;
import pe.com.bn.sach.service.AbonoService;


public class AbonoServiceImpl implements AbonoService{

	
    /** Logger for this class and subclasses */
    private static Logger log = Logger.getLogger(ExpedienteController.class.getName());
    protected final Log logger = LogFactory.getLog(getClass());
    
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		List uta=new ArrayList();
		// TODO Auto-generated method stub
		
	   AbonoServiceImpl AbonoServiceImpl=new AbonoServiceImpl();
     try 
      { 
   ///   uta=AbonoServiceImpl.ListAbonos("04013891465");
  
      AbonoForm abonoForm;
      abonoForm=new AbonoForm();
  
       for (int i = 0; i < uta.size(); i++) {    	    
    	   abonoForm=(AbonoForm)uta.get(i);
  
       } 
      } catch (Exception e) {
      	
      	log.error(""+e);
		// TODO: handle exception
	}
       
	}
	
	HeadRespose cab1 = new HeadRespose();

	public Hashtable  abonoRestul(Hashtable table){
		
		String codigoRetorno="";
		String stadocuenta="";
		Hashtable result = new Hashtable(); 
		List listAbonos=new ArrayList();		
		String trama="";
		HeadRespose cab1 = new HeadRespose();
		result.put("SituacionLaboralOut","");
		result.put("situacionLaboral","-1");
		
		try{
			ResourceBundle rb = ResourceBundle.getBundle("parametro");
			String tx = rb.getString("TxSACHIngrCta");
		    String trm = rb.getString("TxTRAMIngrCta");
		    
			HeadRequest cab = new HeadRequest(
					tx 
					,"WEBAPP"//(String)table.get("usuarioHost")
					,"0000"//(String)table.get("codOficina")//codigo oficina //0046
					,"000000"//(String)table.get("codigoAgencia")//codigo agecinas //000001					
					,trm
					,HeadRequest.TIPO_TRANSACCION_CH);
			BodyConsultaIngreso body = new BodyConsultaIngreso();
			BodyConsultaIngreso body1 = new BodyConsultaIngreso();
			body.InputData((String)table.get("nroCuenta"));
			WSConsultaIngreso consultaIngresoTrama = new WSConsultaIngreso(cab,body);
			consultaIngresoTrama.EjecutarTramaHost(cab1,body1);
			int cont=1;
			String temp="";
			AbonoForm abonoForm=new AbonoForm();
			codigoRetorno=cab1.getByTag("COD-RET");
			
			if(cab1.getByTag("COD-RET").equals("")){
				
				stadocuenta="ERROR EN CODIGO COD-RET HOST";
			}else{
						if(Integer.parseInt(cab1.getByTag("COD-RET"))==0){
							do{
								abonoForm=new AbonoForm();    
								temp=body1.getByTag("SABO-MES"+cont+"-O");					
								if(temp==null)
									break; 
								abonoForm.setMonto(formatMontoTrama(temp));   								
								abonoForm.setPeriodo(formatPerido(body1.getByTag("FEC"+cont+"-O")));
								abonoForm.setNro((cont)+"");
								listAbonos.add(abonoForm);		
								cont++;
		
							}while(temp!=null);
						}
						
						
						if(codigoRetorno!=null)
						{
					
							if(codigoRetorno.trim().length()!=0)
							{
								
								if(Integer.parseInt(codigoRetorno)==0)
								{
									
									if(body1.getByTag("SITUAC-LAB")!=null)
									{
										
										if(body1.getByTag("SITUAC-LAB").trim().length()!=0)
										{
											
											if(Integer.parseInt(body1.getByTag("SITUAC-LAB"))==1)
											{
												stadocuenta ="ACTIVO";
											}
											if(Integer.parseInt(body1.getByTag("SITUAC-LAB"))==2)
											{
												stadocuenta ="CESANTE";
											}
											if(Integer.parseInt(body1.getByTag("SITUAC-LAB"))==3)
											{
												stadocuenta ="JUDICIAL";
											}
											if(Integer.parseInt(body1.getByTag("SITUAC-LAB"))==4)
											{
												stadocuenta ="SOBREVIVIENTE";
											}
											if(Integer.parseInt(body1.getByTag("SITUAC-LAB"))==5)
											{   
												stadocuenta ="ORFANDAD";
											}
											if(Integer.parseInt(body1.getByTag("SITUAC-LAB"))==6)
											{
												stadocuenta ="OTRA";
							 				}
											if(Integer.parseInt(body1.getByTag("SITUAC-LAB"))==7)
											{
												stadocuenta ="CONTRATADO";
											}
											if(Integer.parseInt(body1.getByTag("SITUAC-LAB"))==8)
											{
												stadocuenta ="CONTRATADO SNP";
											}
											
											for (int i = 0; i < listAbonos.size(); i++) {			
												abonoForm=new AbonoForm();
												abonoForm=(AbonoForm)listAbonos.get(i);
												}
											result.put("situacionLaboral",body1.getByTag("SITUAC-LAB"));
											result.put("SituacionLaboralOut",stadocuenta);
											result.put("listAbonos",listAbonos);
										}
										else
										{
											stadocuenta ="SITUACION LABORAL NO EXISTE ";
										}
									}
								}
								else if(Integer.parseInt(codigoRetorno)==1)
								{  
									stadocuenta ="LA CUENTA NO TIENE ABONOS REMUNERADOS";
								}
								else if(Integer.parseInt(codigoRetorno)==2)
								{
									stadocuenta ="LA CUENTA NO EXISTE";
								}			
								else if(Integer.parseInt(codigoRetorno)==99)
								{ 
									
									stadocuenta ="ERROR DE CANCELACION DEL PROGRAMA";
								}
								else
								{
									stadocuenta ="El CODIGO DE RETORNO HOST ES INCORRECTO ";
								}
						
							}else{
									stadocuenta=cab1.getByTag("DES-RET");
							}
							}else{
							
									stadocuenta=cab1.getByTag("DES-RET");
							}			
			
			
			} 
			
		result.put("SituacionLaboralOut",stadocuenta+"");
				
			
		} catch(Exception e){
			result.put("SituacionLaboralOut",""+e);
			e.printStackTrace();
			e.getStackTrace();
			
			logger.error(""+e.getMessage());
		}
		result.put("cuentaRemunerativa",codigoRetorno);
	    result.put("desRet",""+stadocuenta);
		result.put("codRet",""+codigoRetorno);
		result.put("listAbonos",listAbonos);
		return result;
	} 
	

	private String formatPerido(String trama){
		String var=trama;
		String var1=trama;
		return var1.substring(4,6)+"/"+var.substring(0,4);
	}
	private String formatMonto(String tramaMonto){
		String var="";
		String var1="";
		for (int i = 0; i < tramaMonto.length(); i++) {
			if(Double.parseDouble(tramaMonto.substring((i),(i+1))+"")>=Double.parseDouble("1")){
				var=tramaMonto.substring((i),tramaMonto.length());
				break;
			} 
		}
		var1=var;
		return var.substring(0,(var.length()-2))+"."+var.substring((var.length()-2),var.length());
	}
	
	public static Double formatMontoTrama(String value){
		String format="";	
		format=value.substring(2,value.length());		
		return sRounDecimall(new Double(format+""),2);  	
		}
	    public static Double sRounDecimall(Double nro1,int d) {
			double m = Math.pow(10,d);
			double nro=Double.parseDouble(nro1+"");
			double	nro2 = nro * m;		
			double resp= (Math.round(nro2) / m) ;
			return new Double(""+resp);
	   }
	    
	    
	public String[] MontoPromedioxCuenta(
			List  listAb){

		List listAbonos ;
		listAbonos = Util.CopyArray(listAb);
		
		AbonoForm abonoForm=new AbonoForm();
		//separar en cadenas de 18
		int lengtrama=listAbonos.size();
		int nroDSueldosBajos=0;
		
		String trozo="";
		String periodo="";
		String monto="";    
		double contador=0;
		double contadorMonto=0;
		double contadorMontoMasBajos=0;
		
		if(lengtrama==6){nroDSueldosBajos=4;}
		if(lengtrama==5){nroDSueldosBajos=3;}
		List masBajosList=new ArrayList();
		double menor=999999999999999999999999999999999999999999999.00;
		int index=-1; 
		for (int j = 0;j < listAbonos.size();j++) {
			abonoForm=(AbonoForm)listAbonos.get(j);	
			contadorMonto=contadorMonto+Double.parseDouble(abonoForm.getMonto()+"");	
		}
		
		for (int i = 0; i < nroDSueldosBajos; i++) {
				
				for (int j = 0;j < listAbonos.size();j++) {
					
					abonoForm=new AbonoForm();
					abonoForm=(AbonoForm)listAbonos.get(j);					
			
				
					if(menor>Double.parseDouble(abonoForm.getMonto()+"")){
						menor=Double.parseDouble(abonoForm.getMonto()+"");
						index=j;  
						
					}
				} 
				masBajosList.add(i,new Double(""+menor));				
				if(0<=index && index <=listAbonos.size())
				listAbonos.remove(index);
				menor=999999999999999999999999999999999999999999999.00;
				index=-100;
		}
		double sumaTotal=0;
		double montoPromedioTotal;
	

		for (int i = 0; i < masBajosList.size(); i++) {
			contadorMontoMasBajos=Double.parseDouble(""+sRounDecimal(new Double(masBajosList.get(i)+""),2))+contadorMontoMasBajos;
		}
		if(nroDSueldosBajos>0){
			montoPromedioTotal=contadorMontoMasBajos/nroDSueldosBajos;
		}else
			montoPromedioTotal=0.00;  
		
		String[] array  = new String[2];
		 
		array[0]=""+sRounA2dec(montoPromedioTotal);
		array[1]=""+sRounA2dec(contadorMonto);
		
		return array; 
	}
	  public String sRounA2dec(double nro) {	  	
		 String snro=sRounDecimal(new Double(""+nro),2)+"";
		int pos=snro.lastIndexOf(".");
		String pd=snro.substring(pos+1,snro.length());//parte decimal
		if(pd.length()==1){
			snro=snro+"0";
		}
		return snro;
		  }
	  
	  public Double sRounDecimal(Double nro1,int d) {
		double m = Math.pow(10,d);
		double nro=Double.parseDouble(nro1+"");
		double	nro2 = nro * m;		
		double resp= (Math.round(nro2) / m) ;
		return new Double(""+resp);
	}	


	
}

